//
//  KZSlipBanner.swift
//  KZSwiftMoudel
//
//  Created by 朱凯 on 2018/6/21.
//  Copyright © 2018年 JooKey. All rights reserved.
//

import UIKit


// MARK: ------ 滑动横幅视图
class KZSlipBanner: UIView {
    
    
    /// 定时器
    var displayLink: CADisplayLink?
    
    /// 一帧的间隔，间隔越小刷新越快，默认为2，即2个间隔刷新一帧，定时器默认是每秒为60个间隔，即每秒为30帧
    var frameInterval: Int = 2
    
    /// 每帧移动的距离，默认为0.5，即一秒移动0.5*30=15
    var moveDistancePerFrame: CGFloat = 0.5
    
    /// 内容视图，可以放任何视图，对于button，label等控件可以不设置其size，但是对于自定义的视图或系统无法获取size的自带控件仍需要设置size才能运行
    var contentView: UIView? {
        didSet {
            self.setNeedsLayout()
        }
    }
    
    deinit {
        print("滑动横幅销毁")
    }

    /// 初始化
    convenience init() {
        self.init(frame: .zero)
        self.clipsToBounds = true
    }
    
    
    /// 刷新方法
    override func layoutSubviews() {
        
        super.layoutSubviews()
        
        guard let contentView = self.contentView else {
            return
        }
        
        for subview in self.subviews {
            subview.removeFromSuperview()
        }
        
        contentView.sizeToFit()
        self.addSubview(contentView)
        
        contentView.frame = CGRect(x: -contentView.width, y: 0, width: contentView.width, height: contentView.height)
        contentView.y = self.height / 2
    }
    
}

// MARK: ------ 动画
extension KZSlipBanner {
    
    /// 开始
    func start() {
        
        // 首次开始，创建定时器
        if displayLink == nil {
            displayLink = CADisplayLink(target: self, selector: #selector(displayLinkAction))
            
            if #available(iOS 10.0, *) {
                // 每秒的帧数
                displayLink?.preferredFramesPerSecond = 60 / frameInterval
            } else {
                // 帧数间隔
                displayLink?.frameInterval = frameInterval
            }
            displayLink?.add(to: RunLoop.main, forMode: .commonModes)
        }
        
        guard let link = displayLink else { return }
        
        // 暂停中，点开始，则重新开始
        if link.isPaused {
            link.isPaused = false
        }        
    }
    
    /// 暂停
    func pause() {
    
        if let link = displayLink {
            link.isPaused = true
        }
    }
    
    /// 关闭定时器，并复位contentView的位置
    func stop() {
        
        if let link = displayLink, let view = contentView {
            link.invalidate()
            displayLink = nil
            
            view.right = 0
        }
    }
}

// MARK: ------ 事件
extension KZSlipBanner {
    
    @objc private func displayLinkAction() {
        
        guard let view = contentView else {
            displayLink!.invalidate()
            displayLink = nil
            return
        }
        
        let move = moveDistancePerFrame
        
        view.left += move
        
        if view.left > self.width {
            view.left = -self.width
        }
    }
}
